// Package myoffice
// @Author: zhangdi
// @File: excel_replace_new
// @Version: 1.0.0
// @Date: 2023/11/16 17:12
package myoffice

import (
	"fmt"
	"github.com/xuri/excelize/v2"
	"strings"
)

// ExcelReplace excel文本替换 推荐该库
type ExcelReplace struct {
	excel *excelize.File
	conf  *ReplaceConfig
}

func NewExcelReplace(excelFile string, conf *ReplaceConfig) (*ExcelReplace, error) {
	// 打开 Excel 文件
	file, err := excelize.OpenFile(excelFile)
	if err != nil {
		fmt.Println(err)
		return nil, err
	}
	if conf == nil {
		//传入nil 则初始化，取空值,保证conf不为nil
		conf = &ReplaceConfig{}
	}
	return &ExcelReplace{
		conf:  conf,
		excel: file,
	}, nil
}

// ReplaceTexts // ReplaceTexts 实现文本查找和替换，其中replaceMap的key原始文本，value是要替换的文本，sheetIndex 是要操作的sheet
func (s *ExcelReplace) ReplaceTexts(replaceMap map[string]string, sheetIndex int) error {
	// 获取指定的sheet
	sheetName := s.excel.GetSheetName(sheetIndex)
	//sheet := s.excel.GetSheetMap()[sheetName]

	// 遍历sheet中的所有行
	rows, err := s.excel.GetRows(sheetName)
	if err != nil {
		fmt.Println(err)
		return err
	}
	for rowIndex, row := range rows {
		// 遍历当前行中的所有单元格
		for colIndex, cell := range row {
			// 遍历replaceMap中的所有文本
			for originalText, newText := range replaceMap {
				originalText = s.conf.PreStr + originalText + s.conf.SufStr
				// 搜索并替换文本
				if strings.Contains(cell, originalText) {
					// 替换文本
					newCell := strings.ReplaceAll(cell, originalText, newText)
					// 更新单元格值
					cellName, _ := excelize.CoordinatesToCellName(colIndex+1, rowIndex+1)
					s.excel.SetCellValue(sheetName, cellName, newCell)
				}
			}
		}
	}

	return nil
}

func (s *ExcelReplace) SaveToFile(filePath string) error {
	// 保存Excel文件
	err := s.excel.SaveAs(filePath)

	return err
}
